﻿using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using CalculoPreciosUnitarios.Logica.GestorBaseDeDatos.Articulos;
using CalculoPreciosUnitarios.Logica.GestorBaseDeDatos.CotizarArticulos;
using CalculoPreciosUnitarios.Logica.GestorBaseDeDatos.Rubro;
using CalculoPreciosUnitarios.Logica.GestorBaseDeDatos.Unidad;
using CalculoPreciosUnitarios.Logica.GestorObject.Articulo;
using CalculoPreciosUnitarios.Logica.GestorObject.CotizarArticulos;
using CalculoPreciosUnitarios.Logica.GestorObject.Porcentuales_Cantidades;
using CalculoPreciosUnitarios.Logica.GestorObject.Rubro;
using CalculoPreciosUnitarios.Ventanas.Listados;



namespace CalculoPreciosUnitarios.Ventanas.CotizarArticulos
{
    /// <summary>
    /// Lógica de interacción para FCotizarArticulo.xaml
    /// 
    /// 
    /// </summary>
    public partial class FCotizarArticulo : Window
    {
        private IFormatProvider config_local = new System.Globalization.CultureInfo("es-AR");
        CotizarArticulosDB _cotArt = new CotizarArticulosDB();
        CotizarArticulosCS _cotArtItem = new CotizarArticulosCS();
        ArticuloCS _articulo = new ArticuloCS();
        SubRubroCS _subRubAux = new SubRubroCS();
        RubroDB _rubroDB = new RubroDB();
        articulosDB _articuloDB = new articulosDB();
        List<CotizarArticulosCS> _listaCotizar = new List<CotizarArticulosCS>();        
        CargaPorcentualesCantidadesCS _porcentajesYcantidades = new CargaPorcentualesCantidadesCS();
        private string message = "";
        private string caption = "";
        private MessageBoxButton buttons;

        #region constructor
        public FCotizarArticulo(ArticuloCS _articuloAcotizar, CargaPorcentualesCantidadesCS _miPorcentajeYCantidades)
        {
            InitializeComponent();

            //
            // manejador de atajos por teclados !!!
            //
            AddHandler(Keyboard.KeyDownEvent, (KeyEventHandler)HandleKeyDownEvent);


            //seteo al articulo que voy a cotizar o imprimir
            _articulo = _articuloAcotizar;

            //seteo los porcentajes del articulo a cotizar
            _porcentajesYcantidades = _miPorcentajeYCantidades;

            //seteo el titulo de la ventana
            this.Title = this.Title + " - " + "Codigo:  " + _articulo.Codigo + " de:  " + _articulo.Detalle + " x la cantidad de: " + _miPorcentajeYCantidades.CantidadArticulos + " unidad/es";  

            //seteo los valores del dataGrid SubRubros            
            dgSubRubro.ItemsSource = _cotArt.obtenerSubRubros();
            dgSubRubro.Items.Refresh();

            //seteo los valor del dataGrid Cotizar
            _listaCotizar.Clear();
            _listaCotizar = _cotArt.ObtenerCotizarArticulosPorArticulo_CantidadesArt(_articulo, _porcentajesYcantidades);
            //dgDetalleCotizar.ItemsSource = _cotArt.ObtenerCotizarArticulosPorArticulo_CantidadesArt(_articulo, _porcentajesYcantidades);
            dgDetalleCotizar.ItemsSource = _listaCotizar;
            dgDetalleCotizar.Items.Refresh();
            
            //seteo el combo de las unidades
            UnidadBD _unidades = new UnidadBD();
            cbxUnidad.ItemsSource = _unidades.obteneUnidades();
            cbxUnidad.Items.Refresh();
         
            //seteo los datacontext del los textbox de busqueda
            txtBuscarXrubro.DataContext = _subRubAux;
            txtBuscarXsubRubro.DataContext = _subRubAux;
            txtBuscarXdetalle.DataContext = _subRubAux;

            //calculo los porcentajes
            //seteo el DataContext de label1 Ventana
            this.DataContext = _cotArt;

            this.txtCantidadSubRubro.DataContext = _cotArtItem;                        
            this.txtPrecioSubRubro.DataContext = _cotArtItem; //PrecioSubRubro
            this.txtPrecioSugerido.DataContext = _articulo;

            //SETEO LOS PORCENTAJES EN LOS LABELS PARA TENER DE REFERENCIA
            this.lblInsumos.Content = lblInsumos.Content + " - " + _porcentajesYcantidades.Insumos + " %";
            this.lblManoDeObra.Content = lblManoDeObra.Content + " - " + _porcentajesYcantidades.ManoDeObra + " %";
            this.lblGastosFijos.Content = lblGastosFijos.Content + " - " + _porcentajesYcantidades.GastosFijos + " %";
            this.lblRentabilidad.Content = lblRentabilidad.Content + " - " + _porcentajesYcantidades.Rentabilidad + " %";
            this.lblUnidadNeta.Content = lblUnidadNeta.Content + " / " + _porcentajesYcantidades.CantidadArticulos + " U";
            this.lblIva.Content = lblIva.Content + " - " + _porcentajesYcantidades.Iva + " %";
        }
        #endregion

        private void HandleKeyDownEvent(object sender, KeyEventArgs e)
        {


            //if (e.Key == Key.Tab && (Keyboard.Modifiers & (ModifierKeys.Control | ModifierKeys.Shift)) == (ModifierKeys.Control | ModifierKeys.Shift))
            //{
            //    //MessageBox.Show("CTRL + SHIFT + TAB atrapado");
            //}

            if (e.Key == Key.G && (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
            {
                modificarPrecio_Articulo();
            }

            if (e.Key == Key.Delete)
            {
                quitar_item();
            }

            if (e.Key == Key.P && (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
            {
                imprimir_cotizacion();
            }           
        }

        private void btnSalir_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key.ToString().ToUpper())
            {
                case "F3":
                    agregar_cotizacion();
                    break;
                case "F4":
                    modificar_cotizacion();
                    break;
                case "F5":
                    cambiarPrecio_subRubro();
                    break;
                case "ESCAPE":
                    this.Close();
                    break;
                default:
                    return;
            }
        }

        private void txtBuscarXdetalle_KeyUp(object sender, KeyEventArgs e)
        {
            var uie = e.OriginalSource as UIElement;

            if (e.Key == Key.Enter)
            {
                _subRubAux.Descripcion = txtBuscarXdetalle.Text.Trim();                
                dgSubRubro.ItemsSource = _cotArt.ObtenerSubRubrosXdescripcion(_subRubAux);
                dgSubRubro.Items.Refresh();

                //falta filtrar los items de la cotizacion del articulo
                //if (_listaSubRubros.Count != 0)
                //{
                //    _LporcentajesyCantidades.Clear();
                //    dgPorcentajesyCantidades.ItemsSource = _LporcentajesyCantidades;
                
                //-----------------------------------------------------------------
                e.Handled = true;
                uie.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        private void dgSubRubro_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (dgSubRubro.SelectedIndex >= 0)
            {
                SubRubroCS _subrubro = new SubRubroCS();              
                _subrubro = _cotArt.obtenerSubRubroXindiceDataGrid(Convert.ToInt16(dgSubRubro.SelectedIndex));
                _subRubAux.IdRubro = _subrubro.IdRubro;
                _subRubAux.IdSubRubro = _subrubro.IdSubRubro;
                _subRubAux.Descripcion = _subrubro.Descripcion;
                _cotArtItem.PrecioSubRubro = _subRubAux.Precio;
            }                     
        }

        private void txtBuscarXsubRubro_KeyUp(object sender, KeyEventArgs e)
        {
            var uie = e.OriginalSource as UIElement;
            //List<SubRubroCS> _lSubArt = new List<SubRubroCS>();
            var _subRubro = new SubRubroCS();

            if (e.Key == Key.Enter)
            {                                          
                _subRubro.IdRubro = txtBuscarXrubro.Text.Trim().PadLeft(4,'0');
                _subRubro.IdSubRubro = txtBuscarXsubRubro.Text.Trim().PadLeft(4, '0');
                dgSubRubro.ItemsSource = _cotArt.ObtenerSR(_subRubro);
                dgSubRubro.Items.Refresh();
                // ----------------------------------------------------------------
                e.Handled = true;
                uie.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        private void txtBuscarXrubro_KeyUp(object sender, KeyEventArgs e)
        {
            var uie = e.OriginalSource as UIElement;
            
            if (e.Key == Key.Enter)
            {             
                e.Handled = true;
                uie.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        private void btnAgregarItem_Click(object sender, RoutedEventArgs e)
        {
            agregar_cotizacion();
        }

        private void agregar_cotizacion()
        {
            //decimal _PrecioAux = new decimal();
            message = "Se va a agregar un nuevo item. Desea Ingresarlo?";
            caption = "Información";
            buttons = MessageBoxButton.YesNo;
            MessageBoxResult result = MessageBox.Show(message, caption, buttons);
            if (result == MessageBoxResult.Yes)
            {
                CotizarArticulosCS _cotizacion = new CotizarArticulosCS();
                _cotizacion.IdRubro = _subRubAux.IdRubro;
                _cotizacion.IdSubRubro = _subRubAux.IdSubRubro;
                _cotizacion.Cantidad = Convert.ToDecimal(txtCantidadSubRubro.Text);
                _cotizacion.IdUnidad = cbxUnidad.SelectedValue.ToString();
                //agrego y actualizo los items del articulo a cotizar
                _listaCotizar.Clear();
                _listaCotizar = _cotArt.agregarCotizacion(_articulo, _porcentajesYcantidades, _cotizacion);
                dgDetalleCotizar.ItemsSource = _listaCotizar;
                dgDetalleCotizar.Items.Refresh();
                txtPrecioSugerido.Text = _cotArt.Unidad_final.ToString("N2");
                //fin agregar item
            }
        }

        private void cambiarPrecio_subRubro() 
        {
            decimal _PrecioAux = new decimal();
            
            _PrecioAux = Convert.ToDecimal(txtPrecioSubRubro.Text, config_local);
            message = "Se va a modificar el precio del sub-Rubro. Desea modificarlo de todas maneras?";
            caption = "Información";
            buttons = MessageBoxButton.YesNo;
            MessageBoxResult result = MessageBox.Show(message, caption, buttons);            
            if (result == MessageBoxResult.Yes)
            {
                _subRubAux.IdRubro = _cotArtItem.IdRubro;
                _subRubAux.IdSubRubro = _cotArtItem.IdSubRubro;
                _subRubAux.Precio = Convert.ToDecimal(txtPrecioSubRubro.Text, config_local);
                (new RubroDB()).Update_SubRubro_Solo_Precio(_subRubAux);
                //seteo nuevamente los valores del dataGrid SubRubros            
                dgSubRubro.ItemsSource = _cotArt.obtenerSubRubros();
                dgSubRubro.Items.Refresh();

                //actualizo los items del articulo a cotizar
                dgDetalleCotizar.ItemsSource = _cotArt.ObtenerCotizarArticulosPorArticulo_CantidadesArt(_articulo,_porcentajesYcantidades);
                dgDetalleCotizar.Items.Refresh();
                //fin agregar item
                txtPrecioSugerido.Text = _cotArt.Unidad_final.ToString("N2");
            }            
        }

        private void dgDetalleCotizar_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if ((dgDetalleCotizar.SelectedIndex >= 0) && (_cotArt.ListaCotizar.Count > 0))
            {                
                _cotArtItem = null;
                _cotArtItem = _cotArt.ListaCotizar[dgDetalleCotizar.SelectedIndex];
                this.txtCantidadSubRubro.DataContext = _cotArtItem;
                this.txtPrecioSubRubro.DataContext = _cotArtItem; //PrecioSubRubro
                this.cbxUnidad.SelectedValue = Convert.ToInt16(_cotArtItem.IdUnidad);
            }
        }

        private void btnQuitarItem_Click(object sender, RoutedEventArgs e)
        {
            quitar_item();
        }

        private void quitar_item() 
        {
            message = "Se va a eliminar un item de la cotización. Desea eliminarlo de todas formas?";
            caption = "Información";
            buttons = MessageBoxButton.YesNo;
            MessageBoxResult result = MessageBox.Show(message, caption, buttons);
            if (result == MessageBoxResult.Yes)
            {
                _listaCotizar.Clear();
                _listaCotizar = _cotArt.deleteCotizacion(_articulo, _porcentajesYcantidades, _cotArtItem);
                dgDetalleCotizar.ItemsSource = _listaCotizar;
                dgDetalleCotizar.Items.Refresh();
                txtPrecioSugerido.Text = _cotArt.Unidad_final.ToString("N2");
            }
        }

        private void btnModificarItem_Click(object sender, RoutedEventArgs e)
        {
            modificar_cotizacion();
        }

        private void modificar_cotizacion()
        {
            //decimal _PrecioAux = new decimal();
            message = "Se va a modifcar un item de la cotización. Desea modificarlo?";
            caption = "Información";
            buttons = MessageBoxButton.YesNo;
            MessageBoxResult result = MessageBox.Show(message, caption, buttons);
            if (result == MessageBoxResult.Yes)
            {
                CotizarArticulosCS _cotizacion = new CotizarArticulosCS();
                _cotizacion.IdRubro = _subRubAux.IdRubro;
                _cotizacion.IdSubRubro = _subRubAux.IdSubRubro;
                _cotizacion.Cantidad = Convert.ToDecimal(txtCantidadSubRubro.Text);
                _cotizacion.IdUnidad = cbxUnidad.SelectedValue.ToString().Trim();
                _cotizacion.PrecioSubRubro = Convert.ToDecimal(txtPrecioSubRubro.Text, config_local);
                _cotizacion.IdArticulo = _articulo.Codigo;
                _cotizacion.CantidadArticulos = _porcentajesYcantidades.CantidadArticulos;
                _cotizacion.Renglon = _cotArtItem.Renglon;
                //agrego y actualizo los items del articulo a cotizar
                _listaCotizar.Clear();
                _listaCotizar = _cotArt.updateCotizacion(_articulo, _porcentajesYcantidades, _cotizacion);
                dgDetalleCotizar.ItemsSource = _listaCotizar;
                dgDetalleCotizar.Items.Refresh();
                //fin modificar item
                txtPrecioSugerido.Text = _cotArt.Unidad_final.ToString("N2");
            }
        }

        private void btnGrabarPrecio_Click(object sender, RoutedEventArgs e)
        {
            modificarPrecio_Articulo();
        }

        private void modificarPrecio_Articulo()
        {          
            //MessageBox.Show(_articulo.Codigo + " - " + _articulo.Detalle + " - " +  _articulo.Precio);
            _articulo.Precio = Convert.ToDecimal(txtPrecioSugerido.Text.Trim(), config_local);
            _articuloDB.actualizar_Precio(_articulo); 
        }

        private void btnImprimir_Click(object sender, RoutedEventArgs e)
        {
            imprimir_cotizacion();
        }

        private void imprimir_cotizacion()
        {
            string miRdlc = "CalculoPreciosUnitarios.Ventanas.Listados.Listado_Cotizacion.RptCotizar.rdlc";
            string miNameDataSet = "DataSetCotizacion";
            //_listaCotizar.Clear();
            //_listaCotizar = _cotArt.ObtenerCotizarArticulosPorArticulo_CantidadesArt(_articulo, _porcentajesYcantidades);
            FReporte rp = new FReporte(_listaCotizar, miRdlc, miNameDataSet, 2);

            //
            // seteamos la totalidad de los parametros del informe
            //
            rp.DatosEmpresa = "Metalurgica Ramseyer";
            rp.CodigoArt = _articulo.Codigo;
            rp.DetalleArt = _articulo.Detalle;
            rp.CantidadArt = _porcentajesYcantidades.CantidadArticulos.ToString();
            rp.ValorSubTotal = textSubTotal_2.Text;
            rp.DetalleInsumos = lblInsumos.Content.ToString(); rp.ValorInsumos = txtInsumos_2.Text;
            rp.DetalleManoDeObra = lblManoDeObra.Content.ToString(); rp.ValorManoDeObra = txtManoDeObra_2.Text;
            rp.DetalleGastosFijos = lblGastosFijos.Content.ToString(); rp.ValorGastosFijos = txtGastosFijos_2.Text;
            rp.DetalleRentabilidad = lblRentabilidad.Content.ToString(); rp.ValorRentabilidad = txtRentabilidad_2.Text;
            rp.ValorPrecioNeto = txtPrecioNeto_2.Text;
            rp.ValorUnidadNeta = txtUnidadNeta_2.Text;
            rp.DetalleIvaUnidad = lblIva.Content.ToString(); rp.ValorIvaUnidad = txtIva_2.Text;
            rp.ValorUnidadFinal = txtUnidadFinal_2.Text;
            rp.Show();
        }

        private void txtCantidadSubRubro_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if ((ascci >= 48 && ascci <= 57) || (ascci == 44))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txtPrecioSubRubro_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if ((ascci >= 48 && ascci <= 57) || (ascci == 44))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void textSubTotal_2_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if (ascci >= 48 && ascci <= 57)
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txtPrecioSugerido_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if ((ascci >= 48 && ascci <= 57) || (ascci == 44))
                e.Handled = false;
            else
                e.Handled = true;

        }

        private void txtInsumos_2_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if ((ascci >= 48 && ascci <= 57) || (ascci == 44))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txtManoDeObra_2_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if ((ascci >= 48 && ascci <= 57) || (ascci == 44))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txtGastosFijos_2_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if ((ascci >= 48 && ascci <= 57) || (ascci == 44))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txtRentabilidad_2_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if ((ascci >= 48 && ascci <= 57) || (ascci == 44))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txtPrecioNeto_2_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if ((ascci >= 48 && ascci <= 57) || (ascci == 44))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txtUnidadNeta_2_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if ((ascci >= 48 && ascci <= 57) || (ascci == 44))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txtIva_2_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if ((ascci >= 48 && ascci <= 57) || (ascci == 44))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txtUnidadFinal_2_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if ((ascci >= 48 && ascci <= 57) || (ascci == 44))
                e.Handled = false;
            else
                e.Handled = true;
        }


    }
}
